from typing import Any, Dict, List, Optional


class BaseNode:
    """
    节点基类（单一职责：承载通用的节点属性与默认行为）。
    
    Attributes:
        id (str): 节点唯一标识符
        type (str): 节点类型标识（例如 start、condition、httpRequest 等）
        data (Dict[str, Any]): 节点的静态配置数据
        input (Dict[str, Any]): 节点在执行前的输入结构（由运行器或上游节点注入）
        output (Dict[str, Any]): 节点执行后的输出结构（供下游节点使用）
    """
    id: str
    type: str
    data: Dict[str, Any]
    input: Dict[str, Any]
    output: Dict[str, Any]

    def __init__(self, id: str, type_: str, data: Optional[Dict[str, Any]] = None):
        """
        初始化节点对象。
        
        Args:
            id (str): 节点唯一标识符
            type_ (str): 节点类型标识
            data (Optional[Dict[str, Any]]): 节点静态配置
        """
        self.id = id
        self.type = type_
        self.data = data or {}
        # 确保每个节点都具有输入与输出字典结构
        self.input = {}
        self.output = {}

    def execute(self, graph: 'FlowGraph', context: Dict[str, Any], log: callable) -> List[str]:
        """
        节点默认的执行逻辑：直接进入默认出边（source_handle 为 None 或 'default'）。
        
        Args:
            graph ('FlowGraph'): 流程图对象
            context (Dict[str, Any]): 当前执行上下文
            log (callable): 日志记录函数
        
        Returns:
            List[str]: 下一步要执行的节点 ID 列表
        """
        return [e.target for e in graph.get_outgoing_edges(self.id) if e.source_handle in (None, 'default')]